Down stream analysis of the dataset ‘3_IMR90_206plex’
library(Seurat)
library(ggforce)
library(tidyverse)
dcolor <- ggsci::scale_color_d3('category20')
ccolor <- viridis::scale_color_viridis()
style <- function(x,color,method='UMAP',axis=c(1,2),Theme=NULL,
axis.text=FALSE,axis.title=FALSE,coord_fix =TRUE,
palette=TRUE,title=NULL,
legend=TRUE,scale_color_log10=FALSE,
guide_pointSize=2.5,...) {
axis <- paste0(method,axis)
if(is.null(Theme)) Theme <- theme_bw
g <- ggplot() + Theme()
if(coord_fix) {
g <- g + coord_fixed()
}
if(!axis.text) {
g <- g + theme(axis.text = element_blank(),axis.ticks = element_blank())
}
if(!axis.title) {
g <- g + theme(axis.title = element_blank())
}
if(is.null(title)) {
g <- g + ggtitle(method)
}else if(!is.na(title)) {
g <- g + ggtitle(title)
}
if(!legend) g <- g + theme(legend.position = 'none')
if(scale_type(as.matrix(x[,color]))=='discrete' & !is.null(guide_pointSize)) {
g <- g + guides(color = guide_legend(override.aes = list(size=guide_pointSize)))
}
if(palette) {
if(scale_type(as.matrix(x[,color]))=='discrete') {
g <- g + ggsci::scale_color_d3('category20')
}else{
if(scale_color_log10){
g <- g + viridis::scale_color_viridis(trans='log10')
}else{
g <- g + viridis::scale_color_viridis()
}
}
}
return(g)
}
data <- tibble(
path = list.files('3_IMR90_206plex/Raw/',full.names = T),
sampleName = c('d0-r1', 'd0-r2', 'd3-r1', 'd3-r2', 'd6-r1', 'd6-r2')
) %>%
separate(sampleName,into=c('day','rep'),remove = F) %>%
mutate(
metric = map(path,~{
.x %>%
read_csv(show_col_types=F) %>%
unite(cell,tileID,cellID,sep = '-',remove = F)
}),
IF = map(metric,~{.x[,-(2:8)]}),
meta = map2(metric,IF,~{
.x[,1:8] %>%
unite(cell,tileID,cellID,sep = '-',remove = F) %>%
mutate(totalExp = rowSums(.y[,-(1:3)]))
}),
) %>%
select(-path,-metric)
data %>%
select(-IF) %>% unnest(meta) %>%
ggplot(aes(x,y,color=day)) +
theme_void() +
geom_point(size=.5) + dcolor +
facet_grid(rep~day) + coord_fixed()
data %>%
select(sampleName,meta) %>% unnest(meta) %>%
ggplot(aes(sampleName,totalExp)) + geom_violin() + geom_boxplot()
thrsl = c(7,7,5)
names(thrsl) <- c('d0','d3','d6')
dataf <- data %>%
mutate(
idx = map2(meta,day,~{.x$totalExp > thrsl[.y]}),
IF = map2(IF,idx,~{.x[.y,]}),
meta = map2(meta,idx,~{.x[.y,]})
) %>%
mutate(
idx2 = map(IF,~{rowSums(.x[,-1]==0) == 0}),
IF = map2(IF,idx2,~{.x[.y,]}),
meta = map2(meta,idx2,~{.x[.y,]}),
nCell = map(idx2,sum) %>% unlist()
) %>%
select(-idx,-idx2)
dataf %>%
select(sampleName,meta) %>% unnest(meta) %>%
ggplot(aes(sampleName,totalExp)) +
geom_violin() + geom_boxplot()
dataf %>%
ggplot(aes(sampleName,nCell)) +
theme_classic() +
geom_bar(stat='identity') +
scale_x_discrete(limits=rev) +
theme(axis.title.y = element_blank()) +
coord_flip() + theme(aspect.ratio = .35)
tmp <- dataf %>% select(sampleName,IF) %>% unnest(IF)
idx <- with(tmp,model.matrix(~0+sampleName))
colnames(idx) <- sub("sampleName","",colnames(idx))
avgmat <- tmp[,-(1:2)] %>% as.matrix() %>% t %>% {t(.%*%idx)/colSums(idx)} %>% scale %>% asinh %>% t
pheatmap::pheatmap(avgmat,cluster_cols = F,cellwidth = 10,color=viridis::viridis(10),show_rownames = F)
Meta <- dataf %>%
select(sampleName,day,rep,meta) %>% unnest(meta) %>%
unite(Cell,day,rep,cell,sep = '-',remove = F)
X <- bind_rows(dataf$IF) %>% select(-cell) %>%
scale() %>% asinh()
rownames(X) <- Meta$Cell
p <- prcomp(X)
screeplot(p,type='l',n=30)
total <- bind_rows(dataf$meta) %>% pull(totalExp)
cor(p$x[,1:30],total) %>%
plot(xlab = 'PC',ylab = 'CorCoef_vsTotalExp')
um <- uwot::umap(p$x[,2:20],
metric = 'cosine',
n_neighbors = 30,
min_dist = .3) %>%
as_tibble(rownames = 'Cell') %>%
dplyr::rename(UMAP1=2,UMAP2=3)
Metaum <- inner_join(Meta,um,by = 'Cell')
ums <- list(
style(Metaum,'day',title = NULL,size = .25,alpha = .6),
style(Metaum,'rep',title = NA,size = .25,alpha = .6),
style(Metaum,'totalExp',title = NA,size = .25,alpha = .6)
) %>%
patchwork::wrap_plots(ncol = 3)
ums
markers <- c('H3.1','LMNB1','IL-6','p21','pSTAT3')
markers_exp <- X %>%
as_tibble(rownames = 'Cell') %>%
select(Cell,all_of(markers)) %>%
gather(key=SYMBOL,value=ExpLevel,-Cell)
a1 <- Metaum %>%
inner_join(markers_exp,by = 'Cell') %>%
style('ExpLevel',size=.2,title = "") +
theme_bw() + facet_wrap(~SYMBOL,nrow=1) +
theme(axis.ticks = element_blank(),
axis.text = element_blank()) +
labs(color='Expression Level')
a2 <- Metaum %>%
inner_join(markers_exp,by='Cell') %>%
ggplot(aes(sampleName,ExpLevel,fill=day)) +
theme_bw() +
geom_violin() +
geom_boxplot(width=.2,fill='white',outlier.color = NA) +
facet_wrap(~SYMBOL,nrow=1,scales='free') +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_blank()) +
dfill + labs(y='Expression Level')
(a1/a2) + patchwork::plot_layout(guides = 'collect',heights = c(1.3,1))
Senes <- c("gH2AX","HMGA1","Ki67","IL-1a","IL-6","IL-8","LMNB1","p21","p53BP1","PML")
Senes_exp <- X %>%
as_tibble(rownames = 'Cell') %>%
select(Cell,all_of(Senes)) %>%
gather(key=SYMBOL,value=ExpLevel,-Cell)
Metaum %>%
inner_join(Senes_exp,by='Cell') %>%
ggplot(aes(sampleName,ExpLevel,fill=day)) +
theme_bw() +
geom_violin() +
geom_boxplot(width=.2,fill='white',outlier.color = NA) +
facet_wrap(~SYMBOL,scales='free_y') +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_blank()) +
dfill + labs(y='Expression Level')
p2 <- prcomp(X[,Senes])
screeplot(p2,type='l',n=30)
ph <- p2$x[,-1] %>%
phateR::phate(mds.dist.method = "cosine",
knn = 30)
Calculating PHATE...
Running PHATE on 6703 observations and 9 variables.
Calculating graph and diffusion operator...
Calculating KNN search...
Calculated KNN search in 0.55 seconds.
Calculating affinities...
Calculated affinities in 0.04 seconds.
Calculated graph and diffusion operator in 0.61 seconds.
Calculating landmark operator...
Calculating SVD...
Calculated SVD in 0.68 seconds.
Calculating KMeans...
Calculated KMeans in 2.08 seconds.
Calculated landmark operator in 3.16 seconds.
Calculating optimal t...
Automatically selected t = 20
Calculated optimal t in 2.44 seconds.
Calculating diffusion potential...
Calculated diffusion potential in 0.57 seconds.
Calculating metric MDS...
Calculated metric MDS in 4.99 seconds.
Calculated PHATE in 11.77 seconds.
Metaum <- Metaum %>%
mutate(PHATE1=ph$embedding[,1],PHATE2=ph$embedding[,2])
style(Metaum,"day",method = "PHATE",size=.5)
style(Metaum,"totalExp",method = "PHATE",size=.5)
set.seed(1); clu <- ph$embedding %>% kmeans(centers = 5)
ph$embedding %>%
as_tibble() %>%
mutate(clu=as.character(clu$cluster)) %>%
style("clu","PHATE",palette = F,size=.3)
library(slingshot)
sce <- getLineages(ph$embedding, clu$cluster, start.clus = '3')
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = TRUE.Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = TRUE.Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = TRUE.Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = TRUE.Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = TRUE.
sce <- getCurves(sce)
sce
class: PseudotimeOrdering
dim: 6703 1
metadata(4): lineages mst slingParams curves
pathStats(2): pseudotime weights
cellnames(6703): d0-r1-1-3 d0-r1-1-4 ... d6-r2-100-2 d6-r2-100-3
cellData names(2): reducedDim clusterLabels
pathnames(1): Lineage1
pathData names(0):
PT <- slingPseudotime(sce)[,1]
PT <- (PT-min(PT))/(max(PT)-min(PT))
Metaum <- Metaum %>% mutate(PseudoTime=PT)
Metaum
{style(Metaum,'PseudoTime',"PHATE",size=.5)/style(Metaum,'PseudoTime',"UMAP",size=.5)} + patchwork::plot_layout(guides = 'collect')|
{style(Metaum,'day',"PHATE",size=.5)/style(Metaum,'day',"UMAP",size=.5)} + patchwork::plot_layout(guides = 'collect')
Metaum <- Metaum %>%
arrange(PseudoTime) %>%
mutate(
dPseudoTime = (floor(PseudoTime*10)+.5)/10,
dPseudoTime = ifelse(dPseudoTime==1.05,.95,dPseudoTime),
dPseudoTime = as.factor(dPseudoTime)
)
Metaum %>%
ggplot(aes(PseudoTime,fill=day)) +
theme_bw() +
geom_histogram(position = "dodge") + dfill
Metaum %>%
dplyr::count(dPseudoTime,day) %>%
ggplot(aes(dPseudoTime,n,fill=day)) + geom_bar(stat = "identity") + dfill +
theme_bw() +
labs(y="count")
a <- as_tibble(X,rownames="Cell") %>%
gather(key=Prot,value=ExpLevel,-Cell) %>%
left_join(Metaum,by="Cell")
Newdata <- seq(0.2,0.8,by=0.01)
Span <- 0.3
use_p1 <- c('HMGA1','Ki67','LMNB1','p21','p53BP1','PML')
LOESS1 <- a %>%
filter(Prot %in% use_p1) %>%
select(Prot,ExpLevel,PseudoTime) %>%
group_by(Prot) %>% nest() %>%
mutate(LOESS = map(data,~loess(ExpLevel~PseudoTime,.x,span = Span)),
PRED = map(LOESS,~predict(.x,newdata=Newdata)),
newdata = map(PRED,~tibble(PseudoTime=Newdata,PRED=.x)) )
loessPl <- function(x,ratio = .35){
ggplot(x,aes(PseudoTime,scaled,color=Prot)) +
geom_line() + theme_bw() +
theme(legend.position = 'none') +
theme(axis.ticks.y = element_blank(),
strip.background = element_rect(fill=NA,color=NA),
panel.grid.major.x = element_blank(),panel.grid.minor = element_blank()) +
coord_fixed(ratio=ratio) + labs(y = 'scaled expression level')
}
LOESS1_scaled <- LOESS010f %>% select(Prot,newdata) %>%
mutate(newdata = map(newdata,~mutate(.x,scaled = (PRED-min(PRED))/(max(PRED)-min(PRED)) ))) %>%
unnest(newdata) %>% ungroup()
loessPl(LOESS1_scaled)
loessPl(LOESS1_scaled) + facet_wrap(~Prot)
use_p2 <- c("bCatenin","BCL2L1","Frizzled7","NOTCH1","p53BP1","pAKT","pATF2","pATM","pSMAD1/5","pSMAD3","pSRC")
LOESS2 <- a %>%
filter(Prot %in% use_p2) %>%
select(Prot,ExpLevel,PseudoTime) %>%
group_by(Prot) %>% nest() %>%
mutate(LOESS = map(data,~loess(ExpLevel~PseudoTime,.x,span = Span)),
PRED = map(LOESS,~predict(.x,newdata=Newdata)),
newdata = map(PRED,~tibble(PseudoTime=Newdata,PRED=.x)) )
LOESS2_scaled <- LOESS2 %>% select(Prot,newdata) %>%
mutate(newdata = map(newdata,~mutate(.x,scaled = (PRED-min(PRED))/(max(PRED)-min(PRED)) ))) %>%
unnest(newdata) %>% ungroup()
loessPl(LOESS2_scaled)
loessPl(LOESS2_scaled) + facet_wrap(~Prot)
LOESS3 <- a %>%
filter(!Prot %in% use_p1,
!Prot %in% use_p2) %>%
select(Prot,ExpLevel,PseudoTime) %>%
group_by(Prot) %>% nest() %>%
mutate(LOESS = map(data,~loess(ExpLevel~PseudoTime,.x,span = Span)),
PRED = map(LOESS,~predict(.x,newdata=Newdata)),
newdata = map(PRED,~tibble(PseudoTime=Newdata,PRED=.x)) )
LOESS3_scaled <- LOESS3 %>% select(Prot,newdata) %>%
mutate(newdata = map(newdata,~mutate(.x,scaled = (PRED-min(PRED))/(max(PRED)-min(PRED)) ))) %>%
unnest(newdata) %>% ungroup()
id <- unique(LOESS3_scaled$Prot)
LOESS3_scaled %>%
filter(Prot %in% id[1:48]) %>%
loessPl(ratio = .2) + facet_wrap(~Prot,nrow = 6) +
theme(axis.text = element_blank(),axis.ticks.x = element_blank())
LOESS3_scaled %>%
filter(Prot %in% id[49:96]) %>%
loessPl(ratio = .2) + facet_wrap(~Prot,nrow = 6) +
theme(axis.text = element_blank(),axis.ticks.x = element_blank())
LOESS3_scaled %>%
filter(Prot %in% id[97:144]) %>%
loessPl(ratio = .2) + facet_wrap(~Prot,nrow = 6) +
theme(axis.text = element_blank(),axis.ticks.x = element_blank())
LOESS3_scaled %>%
filter(Prot %in% id[145:190]) %>%
loessPl(ratio = .3) + facet_wrap(~Prot,nrow = 6) +
theme(axis.text = element_blank(),axis.ticks.x = element_blank())
spaCor <- function (x, coord, scaled = FALSE, R = 999){
x <- asinh(scale(x))
pos.dist <- dist(x = coord)
pos.dist.mat <- as.matrix(x = pos.dist)
w <- 1/pos.dist.mat^2
diag(x = w) <- 0
w <- w/sum(w)
X <- t(w) %*% scale(x)
t(scale(x))%*%X
}
Spas <- dataf %>%
select(sampleName,day,rep,meta,IF) %>%
mutate(
IF = map2(IF,sampleName,~{
.x %>%
mutate(cell = paste(.y,cell,sep='-')) %>%
tib2df() %>% as.matrix() }),
meta = map2(meta,sampleName,~{
.x %>%
mutate(Cell = paste(.y,cell,sep='-')) %>%
select(Cell,x,y) %>% tib2df() %>% as.matrix()}),
spatialCorMat = map2(IF,meta,~spaCor(.x,.y,scaled = T)),
spatialCorList = map(spatialCorMat,~{
.x[!upper.tri(.x)] <- NA
as_tibble(.x,rownames = 'A') %>%
gather(B,spatialCor,-A) %>% na.omit()
}),
canonicalCorMat = map2(IF,meta,~cor(.x)),
canonicalCorList = map(canonicalCorMat,~{
.x[!upper.tri(.x)] <- NA
as_tibble(.x,rownames = 'A') %>%
gather(B,canonicalCor,-A) %>% na.omit()
})
) %>%
select(-IF,-meta) %>%
mutate(dat = map2(spatialCorList,canonicalCorList,~{
inner_join(.x,.y,by=c('A','B'))
}))
Spas_ <- Spas %>%
select(-spatialCorMat) %>%
unnest(spatialCorList) %>%
ungroup() %>%
unite(lab,A,B,sep=':')
use <- c("NOTCH1:pATM","p21:NOTCH1","p21:pATM")
Spas_ %>% filter(lab %in% use) %>%
group_by(day,lab ) %>% summarise(spatialCor = mean(spatialCor)) %>%
ungroup() %>%
ggplot(aes(day,spatialCor,color=lab,group=lab)) +
theme_bw() +
geom_point(size=2) +
geom_line() +
geom_hline(yintercept = 0,linetype='dashed') +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.x = element_blank()) +
labs(color = 'Pair',y = 'spatial correlation coef.')
smoothTile <- function(Coord,X,N=3,grid=50,bw=2*sqrt(2),df=FALSE,center_weight=3) {
use <- Coord %>% as_tibble() %>% mutate(exp = X)
template <- expand_grid(
tibble(x = seq(1:grid)),
tibble(y = seq(1:grid))
)
D <- as.matrix(dist(template))
D <- D<=bw
tmp <- use %>%
mutate(
x = floor(grid*x/20480),
y = floor(grid*y/20480)
) %>%
group_by(x,y) %>%
summarise(exp=mean(exp)) %>% ungroup() %>%
left_join(template,.,by=c("x","y"))
if(df){
return(tmp)
}else{
for (j in 1:N) {
tmp$exp <- lapply(1:nrow(template), function(x){
if(!is.na(tmp$exp[x])) tmp$exp[x] <- center_weight*tmp$exp[x]
idx <- which(D[x,])
exps <- tmp$exp[idx] %>% na.omit
if(!is.na(tmp$exp[x])) {
res <- sum(exps)/(length(exps)+center_weight-1)
}else{
res <- mean(exps)
}
return(res)
}) %>%
unlist()
tmp$exp <- ifelse(is.na(tmp$exp),min(tmp$exp,na.rm = T),tmp$exp)
}
return(tmp)
}
}
exps1 <- X[grep('d3-r1',rownames(X)),]
coord1 <- Metaum %>% filter(day=='d3',rep=='r1') %>% select(Cell,x,y) %>% tib2df()
p21 <- smoothTile(coord1,exps1[rownames(coord1),'p21'],N = 3,center_weight = 3,bw = 2*sqrt(2),grid = 50)
patm <- smoothTile(coord1,exps1[rownames(coord1),'pATM'],N = 3,center_weight = 3,bw = 2*sqrt(2),grid = 50)
notch <- smoothTile(coord1,exps1[rownames(coord1),'NOTCH1'],N = 3,center_weight = 3,bw = 2*sqrt(2),grid = 50)
p21patm <- inner_join(
p21 %>% dplyr::rename(p21 = exp),
patm %>% dplyr::rename(pATM = exp),
by = c("x","y")
) %>%
mutate(
p21 = (p21-min(p21))/max(p21-min(p21)),
pATM = (pATM-min(pATM))/max(pATM-min(pATM)),
log2FC = log2(p21/pATM)
)
p21_ <- p21 %>%
ggplot(aes(x,y,fill = scale(exp))) + geom_tile() + coord_fixed() +
scale_fill_gradient2(low='white',mid='white',high='green') +
theme_void() + labs(fill='p21')
patm_ <- patm %>%
ggplot(aes(x,y,fill = scale(exp))) + geom_tile() + coord_fixed() +
scale_fill_gradient2(low='white',mid='white',high='blue')+
theme_void() + labs(fill='pATM')
p21patm_ <- p21patm %>%
mutate(
log2FC = ifelse(log2FC < -2.5,-2.5,log2FC),
log2FC = ifelse(log2FC > 2.5,2.5,log2FC)) %>%
ggplot(aes(x,y,fill = log2FC)) + geom_tile() + coord_fixed() +
scale_fill_gradient2(low='blue',mid='white',high='green',midpoint = 0) +
theme_void()
{{p21_/patm_}|p21patm_} + patchwork::plot_layout(guides='collect') & theme(legend.position = 'bottom')
p21notch <- inner_join(
notch %>% dplyr::rename(NOTCH1 = exp),
patm %>% dplyr::rename(pATM = exp),
by = c("x","y")
) %>%
mutate(
NOTCH1 = (NOTCH1-min(NOTCH1))/max(NOTCH1-min(NOTCH1)),
pATM = (pATM-min(pATM))/max(pATM-min(pATM)),
log2FC = log2(NOTCH1/pATM)
)
notch_ <- notch %>%
ggplot(aes(x,y,fill = scale(exp))) + geom_tile() + coord_fixed() +
scale_fill_gradient2(low='white',mid='white',high='red') +
theme_void() +
labs(fill='NOTCH1')
p21notch_ <- p21notch %>%
mutate(
log2FC = ifelse(log2FC < -2.5,-2.5,log2FC),
log2FC = ifelse(log2FC > 2.5,2.5,log2FC)) %>%
ggplot(aes(x,y,fill = log2FC)) + geom_tile() + coord_fixed() + scale_fill_gradient2(low='blue',mid='white',high='red',midpoint = 0) + theme_void()
{{notch_/patm_}|p21notch_} + patchwork::plot_layout(guides='collect') & theme(legend.position = 'bottom')
sessionInfo()
R version 4.2.2 (2022-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.2.1
Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats4 stats graphics grDevices utils datasets methods base
other attached packages:
[1] slingshot_2.6.0 TrajectoryUtils_1.6.0 SingleCellExperiment_1.20.1 SummarizedExperiment_1.28.0 Biobase_2.58.0 GenomicRanges_1.50.2 GenomeInfoDb_1.34.9
[8] IRanges_2.32.0 S4Vectors_0.36.2 BiocGenerics_0.44.0 MatrixGenerics_1.10.0 matrixStats_1.0.0 princurve_2.1.6 lubridate_1.9.2
[15] forcats_1.0.0 stringr_1.5.0 dplyr_1.1.2 purrr_1.0.1 readr_2.1.4 tidyr_1.3.0 tibble_3.2.1
[22] tidyverse_2.0.0 ggforce_0.4.1 ggplot2_3.4.2 SeuratObject_4.1.3 Seurat_4.3.0.1
loaded via a namespace (and not attached):
[1] utf8_1.2.3 spatstat.explore_3.2-1 reticulate_1.30 tidyselect_1.2.0 RSQLite_2.3.1 AnnotationDbi_1.60.2 htmlwidgets_1.6.2
[8] grid_4.2.2 Rtsne_0.16 munsell_0.5.0 codetools_0.2-19 ica_1.0-3 future_1.33.0 miniUI_0.1.1.1
[15] withr_2.5.0 spatstat.random_3.1-5 colorspace_2.1-0 progressr_0.13.0 knitr_1.43 rstudioapi_0.15.0 ROCR_1.0-11
[22] tensor_1.5 listenv_0.9.0 labeling_0.4.2 GenomeInfoDbData_1.2.9 polyclip_1.10-4 bit64_4.0.5 farver_2.1.1
[29] pheatmap_1.0.12 rprojroot_2.0.3 parallelly_1.36.0 vctrs_0.6.3 generics_0.1.3 xfun_0.39 timechange_0.2.0
[36] R6_2.5.1 phateR_1.0.7 isoband_0.2.7 bitops_1.0-7 spatstat.utils_3.0-3 cachem_1.0.8 DelayedArray_0.24.0
[43] promises_1.2.0.1 scales_1.2.1 vroom_1.6.3 gtable_0.3.3 globals_0.16.2 goftest_1.2-3 tidygraph_1.2.3
[50] rlang_1.1.1 pamr_1.56.1 splines_4.2.2 lazyeval_0.2.2 spatstat.geom_3.2-4 yaml_2.3.7 reshape2_1.4.4
[57] abind_1.4-5 stylo_0.7.4 httpuv_1.6.11 tools_4.2.2 tcltk_4.2.2 ellipsis_0.3.2 RColorBrewer_1.1-3
[64] proxy_0.4-27 ggridges_0.5.4 Rcpp_1.0.11 plyr_1.8.8 sparseMatrixStats_1.10.0 zlibbioc_1.44.0 RCurl_1.98-1.12
[71] deldir_1.0-9 pbapply_1.7-2 viridis_0.6.4 cowplot_1.1.1 zoo_1.8-12 ggrepel_0.9.3 cluster_2.1.4
[78] here_1.0.1 magrittr_2.0.3 data.table_1.14.8 scattermore_1.2 lmtest_0.9-40 RANN_2.6.1 fitdistrplus_1.1-11
[85] hms_1.1.3 patchwork_1.1.2 mime_0.12 evaluate_0.21 xtable_1.8-4 gridExtra_2.3 compiler_4.2.2
[92] KernSmooth_2.23-22 crayon_1.5.2 htmltools_0.5.5 mgcv_1.9-0 later_1.3.1 tzdb_0.4.0 DBI_1.1.3
[99] tweenr_2.0.2 MASS_7.3-60 Matrix_1.5-4.1 cli_3.6.1 parallel_4.2.2 igraph_1.5.0.1 pkgconfig_2.0.3
[106] sp_2.0-0 plotly_4.10.2 spatstat.sparse_3.0-2 XVector_0.38.0 digest_0.6.33 sctransform_0.3.5 RcppAnnoy_0.0.21
[113] tsne_0.1-3.1 spatstat.data_3.0-1 Biostrings_2.66.0 rmarkdown_2.23 leiden_0.4.3 uwot_0.1.16 DelayedMatrixStats_1.20.0
[120] shiny_1.7.4.1 lifecycle_1.0.3 nlme_3.1-162 jsonlite_1.8.7 viridisLite_0.4.2 fansi_1.0.4 pillar_1.9.0
[127] ggsci_3.0.0 lattice_0.21-8 KEGGREST_1.38.0 fastmap_1.1.1 httr_1.4.6 survival_3.5-5 glue_1.6.2
[134] png_0.1-8 bit_4.0.5 tcltk2_1.2-11 class_7.3-22 stringi_1.7.12 blob_1.2.4 memoise_2.0.1
[141] irlba_2.3.5.1 e1071_1.7-13 future.apply_1.11.0 ape_5.7-1